package com.bridge.common.sms;

import org.apache.commons.lang3.StringUtils;

import java.security.SecureRandom;
import java.util.Random;
import java.util.UUID;

/**
 * @author sunke
 * @Date 2017/6/12 09:33
 * @description
 */

public class IdGen {

    private static int i = 0;
    public static final String NUMBERCHAR = "0123456789";
    public static final String ENGILSHCHAR = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890";

    private static SecureRandom random = new SecureRandom();


    /**
     * 封装JDK自带的UUID, 通过Random数字生成, 中间无-分割.
     */
    public static String uuid() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }


    /**
     * 使用SecureRandom随机生成Long.
     */
    public static long randomLong() {
        return Math.abs(random.nextLong());
    }


    /**
     * Activiti ID 生成
     */
    public String getNextId() {
        return IdGen.uuid();
    }

    /**
     * Description: 生成条码（卡号）
     */
    public static String getCodeNumber(String prefix) {
        if (!StringUtils.isEmpty(prefix)) {
            //可以修改生成随机数的长度，生成想要的长度的条码
            String num = generateNumString(6);
            String st = prefix + num + getUnixTime();
            return st + getCardCheckCode(st);
        }
        return "prefix不能为空";
    }

    /**
     * 从不含校验位的卡号采用 Luhm 校验算法获得校验位
     */
    private static char getCardCheckCode(String nonCheckCodeCardNo) {
        if (nonCheckCodeCardNo == null
                || nonCheckCodeCardNo.trim().length() == 0
                || !nonCheckCodeCardNo.matches("\\d+")) {
            // 如果传的不是数据返回N
            return 'N';
        }
        char[] chs = nonCheckCodeCardNo.trim().toCharArray();
        int luhmSum = 0;
        for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
            int k = chs[i] - '0';
            if (j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }
            luhmSum += k;
        }
        return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');
    }

    /***
     * 获取当前系统时间戳 并截取后8位
     */
    private static String getUnixTime() {
        try {
            Thread.sleep(10);// 快速执行时，休眠10毫秒 防止号码重复
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        i++;
        i = i > 100 ? i % 10 : i;
        return ((System.currentTimeMillis() / 100) + "").substring(5)
                + (i % 10);
    }

    private static String generateNumString(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(NUMBERCHAR.charAt(random.nextInt(NUMBERCHAR.length())));
        }
        return sb.toString();
    }


}
